#include <stdio.h>
#include <stdlib.h>
#include <string.h> 

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

struct Birthday//构建出生日期结构体 
{
	int year;
	int month;
	int day;
};
struct Score//构建成绩结构体 
{
	double English;
	double Computer;
	double Math;
};
struct Student//构建学生结构 
{
    int num;//学号 
	char name[30];//名字 
	int age;//年龄 
	struct Birthday birth;//出生年月 
	struct Score score;//各科成绩 
};

struct Student stu[100];

int addDate(int number)//添加学生信息函数 
{
	int i;
	printf("**********************\n");
    printf("开始录入学生信息\n");
    printf("**********************\n");
    for (i=0;i<100;i++)
	{
	  printf("请输入学号(输入0退出): \n");//设置条件按0退出添加 
      scanf("%d",&stu[i].num);
      if (stu[i].num == 0)//学号为0时返回 
      {
      	return i;
	  }
	  else//学号不为0时添加学生信息 
	  {
	  	 printf("请输入姓名\n");
         scanf("%s",stu[i].name);
	     printf("请输入出生年月日: \n");
		 scanf("%d%d%d",&stu[i].birth.year,&stu[i].birth.month,&stu[i].birth.day);
		 printf("请输入年龄\n");
         scanf("%d",&stu[i].age);
		
	  }
	  
	}
	return i;
}


void recordScore(int number)//单科成绩的录入的函数 
{
	int i;
	int key;
	
	printf("(1)录入计算机成绩\n"); 
	printf("(2)录入英语成绩\n"); 
	printf("(3)录入数学成绩\n");
    scanf("%d",&key); 
	
	if (key == 1)
	{
		for(i=0; i<number; i++) 
		{
			printf("请输入%s同学的计算机成绩\n",stu[i].name);
			scanf("%lf",&stu[i].score.Computer);
		}
    }
		
	else if (key == 2)	
	{
			for(i=0; i<number; i++) 
		{
			printf("请输入%s同学的英语成绩\n",stu[i].name);
			scanf("%lf",&stu[i].score.English);
		}
			
	}
	else if (key == 3)
	{
		for(i=0; i<number; i++) 
		{
			printf("请输入%s同学的数学成绩\n",stu[i].name);
			scanf("%lf",&stu[i].score.Math);
		}
		
	}	
	else	
	{
	    printf("***输入错误，退出该操作***\n"); 
		return;
	}	
		
}


void showDate()//输出当前学生信息函数 
{
	int i;
	printf("**********************\n");
    printf("学生信息展示\n");
    printf("**********************\n");
	for (i=0;stu[i].num!=0; i++)
	{
      printf("学号: %d\n",stu[i].num);
      printf("姓名: %s\n",stu[i].name);
      printf("出生日期：%d年%d月%d日\n",stu[i].birth.year,stu[i].birth.month,stu[i].birth.day);
      printf("年龄: %d\n",stu[i].age);
	  printf("英语成绩: %lf\n",stu[i].score.English);
	  printf("数学成绩: %lf\n",stu[i].score.Math);
      printf("计算机成绩: %lf\n",stu[i].score.Computer);
    }
}


int showDateNum(int Num,int number)//构建找学生学号得知学生信息的函数 
{
	int i; 
	int flag=0;/*0代表没搜索到指定学号的学生，1代表找到该学生*/ 
			
	for (i=0; i<number; i++)
	{
		if(stu[i].num == Num)
		{
			flag = 1;
			break;
		}
	}
	
	if (flag==1)//flag为1时输出该学生信息 
	{
	    printf("**********************\n");
        printf("学号: %d\n",stu[i].num);
        printf("姓名: %s\n",stu[i].name);
        printf("出生日期：%d年%d月%d日\n",stu[i].birth.year,stu[i].birth.month,stu[i].birth.day);
        printf("年龄: %d\n",stu[i].age);
	    printf("英语成绩: %lf\n",stu[i].score.English);
	    printf("数学成绩: %lf\n",stu[i].score.Math);
        printf("计算机成绩: %lf\n",stu[i].score.Computer);
		
	}
	else
	{
		printf("***未找到该学生信息***\n");
	}
	
	return i;
}


void getDate(int number)//通过学号查询学生信息的函数 
{
	int numm ;//定义一个变量来输入学号找学生信息 
    printf("请输入你要查询的学生学号: \n");
    scanf("%d",&numm);
    printf("该学生的信息如下:\n");
    showDateNum(numm,number);//引用函数来展示学生信息 

}


void editDate(int number)//修改学生信息的函数 
{
	int numm;//用来输入要找学生的学号 
	int numma;//变量来承载修改的信息 
    printf("请输入要修改的学生学号: \n");
    scanf("%d",&numm); 
	numma = showDateNum(numm,number);//引用函数来修改学生信息 
    printf("**********************\n");
    printf("请修改该学生信息\n");
    printf("**********************\n");
    printf("请输入学号\n");
    scanf("%d",&stu[numma].num);
	printf("请输入姓名\n");
    scanf("%s",stu[numma].name);
    printf("请输入出生年月\n ");
    scanf("%d%d%d",&stu[numma].birth.year,&stu[numma].birth.month,&stu[numma].birth.day);
    printf("请输入年龄\n");
    scanf("%d",&stu[numma].age);
	printf("请输入英语成绩\n ");
	scanf("%lf",&stu[numma].score.English);
	printf("请输入数学成绩\n ");
	scanf("%lf",&stu[numma].score.Math);
	printf("请输入计算机成绩\n ");
	scanf("%lf",&stu[numma].score.Computer);
}
 
 

void delDate(int* number)//删除学生信息的函数 
{
	int numm ;//来输入学号 
	int i ;
	int j;
	j=0;
	int key;//判断是否继续删除 
	
    printf("是否确认此操作(1.确认 2.取消)\n");
	scanf("%d",&key);
	
	if (key == 2) //key为2时取消删除 
	{
		printf("已取消删除操作\n"); 
	}
	else if(key == 1)//key不为2时删除该学生信息 
	{
		printf("请输入你要删除的学生学号: \n");
        scanf("%d",&numm);
    	for (i=0;i <= *number; i++)
		{
			if(numm == stu[i].num)
			{
				for(j=i+1;j <= *number ;j++)
				{
						/*		i			j			 
								0			1
								0			2
								*/
				    strcpy(stu[i].name,stu[j].name);//后一位学生信息覆盖删去的学生信息 
				    stu[i].num=stu[j].num;
					stu[i].birth.year=stu[j].birth.year;
					stu[i].birth.month=stu[j].birth.month;
					stu[i].birth.day=stu[j].birth.day;
					stu[i].age=stu[j].age;
					stu[i].score.English=stu[j].score.English;
					stu[i].score.Math=stu[j].score.Math;
					stu[i].score.Computer=stu[j].score.Computer;
					i++;
				}
			}
		} 
    }
    else
    {
    	printf("***输入错误，退出该系统***\n");
    	
	}

} 


void rankComScore(int number)   //计算机成绩排名函数 
{
	 int i;
  	 int j;
     double m;//变量用来交换学生计算机成绩 
     
     for (i=0; i<number; i++)     // 冒泡排序
     {
    	for (j=0; j<number-1-i; j++)           
    	{
    		
			if (stu[j].score.Computer<stu[j+1].score.Computer)//比较两学生计算机成绩，让大的排前面 
			{
				char str[101];      // 用于排序后字符串交换数值
		        m=stu[j].score.Computer;
				stu[j].score.Computer=stu[j+1].score.Computer;
				stu[j+1].score.Computer=m;
				strcpy(str,stu[j+1].name); 
				strcpy(stu[j+1].name,stu[j].name);
				strcpy(stu[j].name,str) ;     
			 }
		} 
     }
     
	 for (i=0; i<number; i++)//根据成绩由高到低输出学生名字和计算机成绩 
	 {
		printf("姓名: %s",stu[i].name);       
		printf("计算机成绩为: %lf\n",stu[i].score.Computer);
     }

} 
    

void rankMathScore(int number) //数学成绩排名函数 
{
	 int i;
  	 int j;
     double m;//变量用来交换学生数学成绩 
     
     for (i=0; i<number; i++)     // 冒泡排序
     {
    	for (j=0; j<number-1-i; j++)           
    	{
    		
			if (stu[j].score.Math<stu[j+1].score.Math)//比较两学生数学成绩，让大的排前面 	
			{
				char str[101];      // 用于排序后字符串交换数值
		        m=stu[j].score.Math;
				stu[j].score.Math=stu[j+1].score.Math;
				stu[j+1].score.Math=m;
				strcpy(str,stu[j+1].name); 
				strcpy(stu[j+1].name,stu[j].name);
				strcpy(stu[j].name,str) ;     
			 }
		} 
     }
     
	 for (i=0; i<number; i++)//根据成绩由高到低输出学生名字和数学成绩 
	 {
		printf("姓名: %s",stu[i].name);       
		printf("数学成绩为: %lf\n",stu[i].score.Math);
     }

} 


void rankEngScore(int number)   //英语成绩排名 
{
	 int i;
  	 int j;
     double m;//变量用来交换学生英语成绩 
     
     for (i=0; i<number; i++)     // 冒泡排序
     {
    	for (j=0; j<number-1-i; j++)           
    	{
    		
			if (stu[j].score.English<stu[j+1].score.English)	//比较两学生英语成绩，让大的排前面 
			{
				char str[101];      // 用于排序后字符串交换数值
		        m=stu[j].score.English;
				stu[j].score.English=stu[j+1].score.English;
				stu[j+1].score.English=m;
				strcpy(str,stu[j+1].name); 
				strcpy(stu[j+1].name,stu[j].name);
				strcpy(stu[j].name,str) ;     
			 }
		} 
     }
     
	 for (i=0; i<number; i++)//根据成绩由高到低输出学生名字和英语成绩 
	 {
		printf("姓名: %s",stu[i].name);       
		printf("英语成绩为: %lf\n",stu[i].score.English);
     }

} 


void failtwoScore(int number)//统计两科以上不及格的学生 
{
	int i;
	for (i=0; i<number; i++)
	{
		if( (stu[i].score.Computer<60 && stu[i].score.English<60) || (stu[i].score.Computer<60 && stu[i].score.Math<60) || (stu[i].score.English<60 && stu[i].score.Math<60)  )
		{
			printf("两科及以上不及格的学生姓名如下\n");
			printf("姓名: %s\n",stu[i].name);
		}
	    
	 } 
	
}

void main()
{
	char pwd[7];//6位密码和\0
	int counter;
	counter = 0;//输入密码次数 
	int flag;//判断密码是否正确的变量 
	flag = 0; 
	int i;
	int number;
	number = 0;/*已有的成员数量存入number*/ 
	 
	printf("***~欢迎进入学生成绩管理系统~***"); 
	 
	 //输入密码 
	while(counter < 3)
	{
	 	printf("\n请输入密码\n");
	 	for (i=0; i<6; i++)
		{
		 	pwd[i] = getch();
		 	printf("*");//用*来提醒输入几个数了 
	    }
    	pwd[6] = '\0';
    	counter++;//输入一次密码后计数器加1 
    	if (strcmp(pwd, "123456") == 0)//比较输入的密码与设定的密码是否一致 
    	{
    	 	flag = 1;
    	    break;
		}
		else
		{
		 	if (counter != 3)
			{
		 		printf("\n密码错误！\n你还有%d次机会! \n",3-counter);
			}
		 	
		}
	}
	 
	if(flag == 1)//flag为1时进入系统 
	{
	     int key; 
     	 for (;;)//一直循环
         {
     	      printf("欢迎来到学生信息管理系统\n");
	          printf("**********************\n");
	          printf("(1)查询学生信息\n");
	          printf("(2)添加学生信息\n"); 
           	  printf("(3)修改学生信息\n"); 
	          printf("(4)删除学生信息\n"); 
    	      printf("(5)输出当前学生信息\n"); 
              printf("(6)计算机的成绩排名\n"); 
              printf("(7)英语的成绩排名\n"); 
              printf("(8)数学的成绩排名\n"); 
              printf("(9)不及格两科以上的学生名字\n");
              printf("(10)录入学生单科成绩\n");
              printf("(0)退出该系统\n");
              
    	      printf("请选择你要进行的操作: \n");
	          scanf("%d",&key);
	          
   	          switch(key)//选择不同程序 
	          {
		           case 1:
		        	 getDate(number); 
		        	 break;
		
		           case 2:
		             number=addDate(number);
		             printf("number:%d\n",number); 
			         break;
			
		           case 3:
		 	         editDate(number);
			         break;
			
	               case 4:	
		  	         delDate(&number);
	            	 break;
			
		           case 5:
			         showDate();
			         break;
			
		           case 6:
		 	         rankComScore(number);
			         break;
			
		           case 7:
		 	         rankEngScore(number);
		 	         break;	
			
		           case 8:
		 	         rankMathScore(number);
			         break;	
			
		           case 9:	
			         failtwoScore(number);
		        	 break;
			
			       case 10:	
			         recordScore(number);
		             break;
		
		           case 0:
		             printf("感谢你本次使用此系统，期待你的下一次使用\n");
		 	         exit(0);
		 	         break;
		
		           default:
		             printf("不是正确的输入！！！\n");
		             break;
	           } 
          }
    }
    else//flag不为1时退出系统 
	{
	   printf("\n密码错误，请退出重进管理系统\n");
	}
	 
}
